/*---------------------------------------------------------
   Starts up the ghost entity
   The most important part of this is making sure it gets deleted properly
---------------------------------------------------------*/
function ToolObj:MakeGhostEntity( model, pos, angle )

    util.PrecacheModel( model )
    
    // We do ghosting serverside in single player
    // It's done clientside in multiplayer
    if (SERVER && !SinglePlayer()) then return end
    if (CLIENT && SinglePlayer()) then return end
    
    // Release the old ghost entity
    self:ReleaseGhostEntity()
    
    // Don't allow ragdolls/effects to be ghosts
    if (!util.IsValidProp( model )) then return end
    
    self.GhostEntity = ents.Create( "prop_physics" )
    
    // If there's too many entities we might not spawn..
    if (!self.GhostEntity:IsValid()) then
        self.GhostEntity = nil
        return
    end
    
    self.GhostEntity:SetModel( model )
    self.GhostEntity:SetPos( pos )
    self.GhostEntity:SetAngles( angle )
    self.GhostEntity:Spawn()
    
    self.GhostEntity:SetSolid( SOLID_VPHYSICS );
    self.GhostEntity:SetMoveType( MOVETYPE_NONE )
    self.GhostEntity:SetNotSolid( true );
    self.GhostEntity:SetRenderMode( RENDERMODE_TRANSALPHA )
    self.GhostEntity:SetColor( 255, 255, 255, 150 )
    
end

/*---------------------------------------------------------
   Starts up the ghost entity
   The most important part of this is making sure it gets deleted properly
---------------------------------------------------------*/
function ToolObj:StartGhostEntity( ent )

    // We can't ghost ragdolls because it looks like ass
    local class = ent:GetClass()
    
    // We do ghosting serverside in single player
    // It's done clientside in multiplayer
    if (SERVER && !SinglePlayer()) then return end
    if (CLIENT && SinglePlayer()) then return end
    
    self:MakeGhostEntity( ent:GetModel(), ent:GetPos(), ent:GetAngles() )
    
end

/*---------------------------------------------------------
   Releases up the ghost entity
---------------------------------------------------------*/
function ToolObj:ReleaseGhostEntity()
    
    if ( self.GhostEntity ) then
        if (!self.GhostEntity:IsValid()) then self.GhostEntity = nil return end
        self.GhostEntity:Remove()
        self.GhostEntity = nil
    end
    
    if ( self.GhostEntities ) then
    
        for k,v in pairs( self.GhostEntities ) do
            if ( v:IsValid() ) then v:Remove() end
            self.GhostEntities[k] = nil
        end
        
        self.GhostEntities = nil
    end
    
    if ( self.GhostOffset ) then
    
        for k,v in pairs( self.GhostOffset ) do
            self.GhostOffset[k] = nil
        end
        
    end
    
end

/*---------------------------------------------------------
   Update the ghost entity
---------------------------------------------------------*/
function ToolObj:UpdateGhostEntity()

    if (self.GhostEntity == nil) then return end
    if (!self.GhostEntity:IsValid()) then self.GhostEntity = nil return end
    
    local tr = utilx.GetPlayerTrace( self:GetOwner(), self:GetOwner():GetCursorAimVector() )
    local trace = util.TraceLine( tr )
    if (!trace.Hit) then return end
    
    local Ang1, Ang2 = self:GetNormal(1):Angle(), (trace.HitNormal * -1):Angle()
    local TargetAngle = self:GetEnt(1):AlignAngles( Ang1, Ang2 )
    
    self.GhostEntity:SetPos( self:GetEnt(1):GetPos() )
    self.GhostEntity:SetAngles( TargetAngle )
    
    local TranslatedPos = self.GhostEntity:LocalToWorld( self:GetLocalPos(1) )
    local TargetPos = trace.HitPos + (self:GetEnt(1):GetPos() - TranslatedPos) + (trace.HitNormal)
    
    self.GhostEntity:SetPos( TargetPos )
    
end